Python错误及异常总结汇总

您所在的位置:网站首页 python 报错机制 Python错误及异常总结汇总

Python错误及异常总结汇总

#Python错误及异常总结汇总| 来源: 网络整理| 查看: 265

前言

程序员的一生中,错误几乎每天都在发生。在过去的一个时期, 错误要么对程序(可能还有机器)是致命的,要么产生一大堆无意义的输出,无法被其他计算机或程序识别,连程序员自己也可能搞不懂它的意义。一旦出现错误,程序就会终止执行,直到错误被修正,程序重新执行。所以,人们需要一个”柔和”的处理错误的方法,而不是终止程序。同时,程序本身也在不断发展,并不是每个错误都是致命的,即使错误发生,编译器或是在执行中的程序也可以提供更多更有用的诊断信息,帮助程序员尽快解决问题。然而,错误毕竟是错误,一般都是停止编译或执行后才能去解决它。一小段代码只能让程序终止执行,也许还能打印出一些模糊的提示。当然,这一切都是在异常和异常处理出现之前的事了。

1. 错误

从软件方面来说,错误是语法或是逻辑上的。语法错误指示软件的结构上有错误,导致不能被解释器解释或编译器无法编译。这些错误必须在程序执行前纠正。当程序的语法正确后,剩下的就是逻辑错误了。逻辑错误可能是由于不完整或是不合法的输入所致;在其他情况下,还可能是逻辑无法生成,计算,或是输出结果需要的过程无法执行。这些错误通常分别被称为域错误和范围错误。

当 Python 检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了异常。

2. 异常

对异常的最好描述是: 它是因为程序出现了错误而在正常控制流以外采取的行为。这个行为又分为两个阶段: 首先是引起异常发生的错误,然后是检测(和采取可能的措施)阶段。

第一个阶段是在发生了一个异常条件(有时候也叫做例外的条件)后发生的。只要检测到错误并且意识到异常条件,解释器会引发一个异常。引发也可以叫做触发或者生成,解释器通过它通知当前控制流有错误发生。Python 也允许程序员自己引发异常,无论是 Python 解释器还是程序员引发的,异常就是错误发生的信号,当前流将被打断,用来处理这个错误并采取相应的操作,这就是第二阶段。

对异常的处理发生在第二阶段。异常引发后,可以调用很多不同的操作,可以是忽略错误(记录错误但不采取任何措施, 采取补救措施后终止程序),或是减轻问题的影响后设法继续执行程序。所有的这些操作都代表一种继续,或是控制的分支,关键是程序员在错误发生时可以指示程序如何执行。

类似 Python 这样支持引发和处理异常(这更重要)的语言,可以让开发人员可以在错误发生时更直接地控制它们。程序员不仅仅有了检测错误的能力,还可以在它们发生时采取更可靠的补救措施。由于有了运行时管理错误的能力,应用程序的健壮性有了很大的提高。

异常和异常处理并不是什么新概念。它们同样存在于 Ada,Modula-3,C++++,Eiffel,以及 Java 中。异常的起源可以追溯到处理系统错误和硬件中断这类异常的操作系统代码。在 1965 年左右,PL/1 作为第一个支持异常的主要语言出现,而异常处理是作为一个它提供的软件工具。和其他支持异常处理的语言类似,Python 采用了 “try/尝试” 块和 “catching/捕获” 块的概念,而且它在异常处理方面更有”纪律性”。我们可以为不同的异常创建不同的处理器,而不是盲目地创建一个”catch-all/捕获所有”的代码。

3. python中常见异常

NameError:尝试访问一个未声明的变量

NameError表示我们访问了一个没有初始化的变量. 在 Python 解释器的符号表没有找到那个另人讨厌的变量. 我们将在后面的两章讨论名称空间, 现在大家可以认为它们是连接名字和对象的”地址簿”就可以了. 任何可访问的变量必须在名称空间里列出. 访问变量需要由解释器进行搜索, 如果请求的名字没有在任何名称空间里找到, 那么将会生成一个NameError异常.

ZeroDivisionError:除数为零

我们边的例子使用的是整数, 但事实上, 任何数值被零除都会导致一个ZeroDivisionError异常.

SyntaxError:Python 解释器语法错误

SyntaxError 异常是唯一不是在运行时发生的异常.它代表 Python 代码中有一个不正确的结构, 在它改正之前程序无法执行. 这些错误一般都是在编译时发生, Python 解释器无法把你的脚本转化为 Python 字节代码. 当然这也可能是你导入一个有缺陷的模块的时候.

IndexError:请求的索引超出序列范围

IndexError在你尝试使用一个超出范围的值索引序列时引发.

KeyError:请求一个不存在的字典关键字

映射对象, 例如字典, 是依靠关键字(keys)访问数据值的. 如果使用错误的或是不存在的键请求字典就会引发一个KeyError异常.

IOError:输入/输出错误

AttributeError:尝试访问未知的对象属性

我们在 myInst.hp 储存了一个值, 也就是实例 myInst 的 hp 属性. 属性被定义后, 我们可以使用熟悉的点/属性操作符访问它, 但如果是没有定义属性, 例如我们访问 hq 属性, 将导致一个AttributeError异常.

4. 检测和处理异常

异常可以通过try语句来检测。任何在try语句块里的代码都会被监测,检查有无异常发生。

try语句有两种主要形式:try-except和try-finally. 这两个语句是互斥的, 也就是说你只 能 使 用 其 中 的 一 种 . 一 个try语 句 可 以 对 应 一 个 或 多 个except子 句 , 但 只 能 对 应 一 个finally子句, 或是一个try-except-finally复合语句.

你可以使用try-except语句检测和处理异常. 你也可以添加一个可选的else子句处理没有探测到异常的时执行的代码. 而try-finally只允许检测异常并做一些必要的清除工作(无论发生错误与否), 没有任何异常处理设施. 正如你想像的, 复合语句两者都可以做到.

try-except 语句

最 常 见 的try-except语 句 语 法 如 下 所 示,它 由try块 和except块 (try_suite 和 except_suite )组成,也可以有一个可选的错误原因。

带有多个 except 的 try 语句

这种格式的 except 语句指定检测名为 Exception 的异常. 你可以把多个 except 语句连接在一起, 处理一个 try 块中可能发生的多种异常, 如下所示:

处理多个异常的 except 语句

我们还可以在一个 except 子句里处理多个异常,前提只是它们被放入一个元组里 , 如下:

Note:try语句块中异常发生点后的剩余语句永远不会到达(所以也永远不会执行)。一旦一个异常被引发,就必须决定控制流下一步到达的位置。剩余代码将被忽略,解释器将搜索处理器,一旦找到,就开始执行处理器中的代码。

如果没有找到合适的处理器,那么异常就向上移交给调用者去处理,这意味着堆栈框架立即回到之前的那个。如果在上层调用者也没找到对应处理器,该异常会继续被向上移交,直到找到合适处理器。如果到达最顶层仍然没有找到对应处理器,那么就认为这个异常是未处理的,Python 解释器会显示出跟踪返回消息,然后退出。

Python 提供给程序员的try-except语句是为了更好地跟踪潜在的错误并在代码里准备好处理异常的逻辑,这样的机制在其他语言(例如 C ) 是很难实现的,它的目的是减少程序出错的次数并在出错后仍能保证程序正常执行。作为一种工具而言,只有正确得当地使用它,才能使其发挥作用。

避免把大片的代码装入try-except中然后使用pass忽略掉错误,你可以捕获特定的异常并忽略它们,或是捕获所有异常并采取特定的动作。不要捕获所有异常,然后忽略掉它们。

异常参数

异常也可以有参数,异常引发后它会被传递给异常处理器。当异常被引发后参数是作为附加帮助信息传递给异常处理器的。虽然异常原因是可选的,但标准内建异常提供至少一个参数,指示异常原因的一个字符串。

异常的参数可以在处理器里忽略,但 Python 提供了保存这个值的语法,我们已经在上边接触到相关内容:要想访问提供的异常原因,你必须保留一个变量来保存这个参数。把这个参数放在except语句后,接在要处理的异常后面。

reason 将会是一个包含来自导致异常的代码的诊断信息的类实例。异常参数自身会组成一个元组,并存储为类实例 ( 异 常 类 的 实 例 ) 的 属 性 。上 边 的 第 一 种 用 法 中,reason 将 会 是 一 个Exception类的实例。

else 子句

我们已经看过else语句段配合其他的 Python 语句,比如条件和循环。至于try-except语句段,它的功能和你所见过的其他else没有太多的不同:在try范围中没有异常被检测到时,执行else子句。

在else范围中的任何代码运行前,try范围中的所有代码必须完全成功(也就是,结束前没有引发异常)。

finally 子句

finally子句是无论异常是否发生,是否捕捉都会执行的一段代码。你可以将finally仅仅配合try一起使用,也可以和try-except(else 也是可选的)一起使用,也可以使用独立的try-finally。

当然,无论如何,你都可以有不止一个的except子句,但最少有一个except语句,而else和finally都是可选的。A,B,C 和 D 是程序(代码块)。程序会按预期的顺序执行。(注意:可能的顺序是A-C-D[正常] 或 A-B-D[异常])。无论异常发生在 A,B,和/或 C 都将执行finally块。

另一种使用finally的方式是finally单独和try连用。这个try-finally语句和try-except区别在于它不是用来捕捉异常的。作为替代,它常常用来维持一致的行为而无论异常是否发生。我们得知无论try中是否有异常触发,finally代码段都会被执行。

try-except-else-finally语句

无论你选择什么语法,你至少要有一个except子句,而else和finally都是可选的。

with语句

with语句的目的在于从流程图中把try,except和finally关键字和资源分配释放相关代码统统去掉,而不是像try-except-finally那样仅仅简化代码使之易用。with语法的基本用法看上去如下:

这段代码试图打开一个文件,如果一切正常,把文件对象赋值给 f。然后,用迭代器遍历文件中的每一行,当完成时,关闭文件。无论在这一段代码的开始,中间,还是结束时发生异常,都会执行清理的代码,此外文件仍会被自动的关闭。

5. 触发异常

raise语句

raise语句对所支持是参数十分灵活,对应到语法上就是支持许多不同的格式.rasie 一般的用法是:

第一个参数,SomeExcpetion,是触发异常的名字.如果有,它必须是一个字符串,类或实例(详见下文).如果有其他参数(arg 或 traceback),就必须提供 SomeExcpetion.

第二个符号为可选的 args(比如参数,值),来传给异常.这可以是一个单独的对象也可以是一个对象的元组.当异常发生时,异常的参数总是作为一个元组传入.如果 args 原本就是元组,那么就将其传给异常去处理;如果 args 是一个单独的对象,就生成只有一个元素的元组(就是单元素元组).大多数情况下,单一的字符串用来指示错误的原因.如果传的是元组,通常的组成是一个错误字符串,一个错误编号,可能还有一个错误的地址,比如文件,等等.

最后一项参数,traceback,同样是可选的(实际上很少用它),如果有的话,则是当异常触发时新生成的一个用于异常-正常化(exception—normally)的追踪(traceback)对象.当你想重新引发异常时,第三个参数很有用(可以用来区分先前和当前的位置).如果没有这个参数,就填写 None.

6. 断言语句

断言语句等价于这样的 Python 表达式,如果断言成功不采取任何措施(类似语句),否则触发AssertionError(断言错误)的异常.assert 的语法如下:

原文标题:Python错误及异常总结汇总

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

扫一扫,分享给好友

复制链接分享 评论

发布评论请先 登录

相关推荐

pip 的超全使用指南 1. 查询软件包查询当前环境安装的所有软件包 [code]$ pip list[/code]查询 pypi 上含有某名字的包 [code]$ pip search pkg[/co... 发表于 03-11 16:03 • 3613次 阅读 一文了解pip的超全使用指南 由于默认情况下,wheel 包的平台是运行 pip download 命令 的平台,所以可能出现平台.... 的头像 python爬虫知识分享 发表于 03-11 16:03 • 157次 阅读 python常规包与命名空间包 python常规包与命名空间包1. 常规包在 Python 3.3 之前或者说 Python 2 中,一个包想要被导入使用,那么该包内必须要有 __init... 发表于 03-11 15:46 • 2055次 阅读 详解python常规包与命名空间包 python常规包与命名空间包 1. 常规包 在 Python 3.3 之前或者说 Python 2.... 的头像 python爬虫知识分享 发表于 03-11 15:46 • 175次 阅读 python花式导包的八种方法 python花式导包的八种方法1. 直接 import人尽皆知的方法,直接导入即可 [code]>>> import os >>> os.getcwd() '/home/xxx'[/c... 发表于 03-10 16:51 • 756次 阅读 python花式导包的八种方法 python花式导包的八种方法 1. 直接 import 人尽皆知的方法,直接导入即可 import.... 的头像 python爬虫知识分享 发表于 03-10 16:48 • 159次 阅读 python安装第三方包的八种方法 python安装第三方包的八种方法1. 使用 easy_installeasy_install 这应该是最古老的包安装方式了,目前基本没有人使用了。下面是 ... 发表于 03-10 16:29 • 1024次 阅读 python安装第三方包的八种方法 python安装第三方包的八种方法 1. 使用 easy_install easy_install .... 的头像 python爬虫知识分享 发表于 03-10 16:27 • 134次 阅读 今天咱们用Python整一个超级玛丽游戏 | 附带源码 开发环境Python版本:3.7.8相关模块:requests模块;tqdm模块;pyfreeproxy模块;pyecharts模块;以及一些python自带的模块。... 发表于 03-10 14:26 • 734次 阅读 今天咱们用Python整一个超级玛丽游戏 | 附带源码 如何在RK3288上安装Opencv? 如何在RK3288上安装Opencv? 发表于 03-10 06:49 • 155次 阅读 如何才能在RV1109平台上编写基于USB Camera的demo程序? 如何才能在RV1109平台上编写基于USB Camera的demo程序?... 发表于 03-10 06:15 • 77次 阅读 什么是python包、模块和库? 1. 模块以 .py 为后缀的文件,我们称之为 模块,英文名 Module。 模块让你能够有逻辑地组织你的 Python 代码段,把相关的代码... 发表于 03-09 16:48 • 457次 阅读 python包、模块和库是什么 1. 模块 以 .py 为后缀的文件,我们称之为 模块,英文名 Module。 模块让你能够有逻辑地.... 的头像 python爬虫知识分享 发表于 03-09 16:47 • 191次 阅读 python类的多态和类的property属性 python类的多态多态,是指在同一类型下的不同形态。 比如下面这段代码 [code]class People:     def speak(self):... 发表于 03-09 16:38 • 738次 阅读 python类的多态和类的property属性 python类的多态 多态,是指在同一类型下的不同形态。 比如下面这段代码 class People.... 的头像 python爬虫知识分享 发表于 03-09 16:37 • 161次 阅读 用Python学习科学编程 用Python学习科学编程,Python经典教材。 发表于 03-09 15:00 • 24次 阅读 怎样在debian下安装python3+pymssql呢 怎样在debian下安装python3+pymssql呢?有哪些安装步骤?... 发表于 03-09 06:32 • 79次 阅读 python类的继承详解 python类的继承 类的继承,跟人类繁衍的关系相似。 被继承的类称为基类(也叫做父类),继承而得的.... 的头像 python爬虫知识分享 发表于 03-08 16:40 • 327次 阅读 python私有变量和私有方法 python私有变量和私有方法 1. 下划线妙用 在 Python 中,下划线可是非常推荐使用的符号.... 的头像 python爬虫知识分享 发表于 03-08 16:30 • 380次 阅读 python静态方法与类方法 python静态方法与类方法 1. 写法上的差异 类的方法可以分为: 静态方法:有 staticme.... 的头像 python爬虫知识分享 发表于 03-07 16:56 • 402次 阅读 python类的理解与使用 python类的理解与使用 1. 通俗理解类 类(英文名 class),是具有相同特性(属性)和行为.... 的头像 python爬虫知识分享 发表于 03-07 16:51 • 384次 阅读 python如何捕获异常和主动抛出异常 python如何主动抛出异常和捕获异常 1. 如何抛出异常? 异常的产生有两种来源: 一种是程序自动.... 的头像 python爬虫知识分享 发表于 03-04 17:09 • 656次 阅读 Python中有哪些常见的错误和异常 python常见异常类型 在程序运行过程中,总会遇到各种各样的问题和错误。 有些错误是我们编写代码时.... 的头像 python爬虫知识分享 发表于 03-04 16:58 • 661次 阅读 python变量的作用域 python变量的作用域 1. 作用域 Python的作用域可以分为四种: L (Local) 局部.... 的头像 python爬虫知识分享 发表于 03-03 16:50 • 400次 阅读 python偏函数和泛型函数详解 python偏函数 假如一个函数定义了多个位置参数,那你每次调用时,都需要把这些个参数一个一个地传递.... 的头像 python爬虫知识分享 发表于 03-03 16:43 • 409次 阅读 python高阶函数详解 python高阶函数 1. map 函数 map 函数,它接收两个参数,第一个参数是一个函数对象(当.... 的头像 python爬虫知识分享 发表于 03-02 16:47 • 173次 阅读 python高阶函数详解 python匿名函数的使用 python匿名函数的使用 匿名函数(英语:anonymous function)是指一类无需定义标.... 的头像 python爬虫知识分享 发表于 03-02 16:42 • 168次 阅读 11个案例讲解python函数参数 函数,在定义的时候,可以有参数的,也可以没有参数。 的头像 python爬虫知识分享 发表于 03-01 16:39 • 235次 阅读 详解python普通函数创建与调用 函数是一种仅在调用时运行的代码块。您可以将数据(称为参数)传递到函数中,然后由函数可以把数据作为结果.... 的头像 python爬虫知识分享 发表于 03-01 16:32 • 228次 阅读 python推导式是什么 python推导式 推导式(英文名:comprehensions),也叫解析式,是Python的一种.... 的头像 python爬虫知识分享 发表于 02-28 17:13 • 189次 阅读 python while循环详解 python while循环 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处.... 的头像 python爬虫知识分享 发表于 02-28 16:39 • 171次 阅读 《深入Python3》中文版pdf 《深入Python3》中文版pdf 发表于 02-28 09:45 • 34次 阅读 《Dive Into Python》中文翻译版.pdf 《Dive Into Python》中文翻译版.pdf 发表于 02-25 17:22 • 27次 阅读 python for循环的案例说明 python for循环 for 循环可以遍历任何序列的项目,如一个列表或者一个字符串。 它的基本语.... 的头像 python爬虫知识分享 发表于 02-25 16:27 • 213次 阅读 python判断语句的详细说明 python判断语句:if 1. 简单小例子 如果满足条件 A,则执行代码块 a,否则执行代码块 b.... 的头像 python爬虫知识分享 发表于 02-25 16:22 • 221次 阅读 python生成器是什么 python生成器 1. 什么是生成器? 生成器(英文名 Generator ),是一个可以像迭代器.... 的头像 python爬虫知识分享 发表于 02-24 15:53 • 227次 阅读 python迭代器详解 python迭代器 1. 可迭代对象 可以利用 for 循环的对象,都叫可迭代对象。 列表、元组、字.... 的头像 python爬虫知识分享 发表于 02-24 15:42 • 201次 阅读 初学者学Python必看的几个练手小项目 Python是一种面向对象的解释型编程语言,源代码与解释器CPython遵守GPL协议,Python.... 的头像 叶枫架构师 发表于 02-23 17:06 • 289次 阅读 4个Python经典项目实战,练手必备! Python是一种极具可读性和通用性的编程语言。Python这个名字的灵感来自于英国喜剧团体Mont.... 的头像 叶枫架构师 发表于 02-23 17:06 • 271次 阅读 python集合是什么 python集合 集合(英文名 set),它是一个无序的不重复元素序列。 这里面有两个重点: 无序,.... 的头像 python爬虫知识分享 发表于 02-23 17:01 • 258次 阅读 python字典是什么 python字典 字典(英文名 dict),它是由一系列的键值(key-value)对组合而成的数据.... 的头像 python爬虫知识分享 发表于 02-23 16:54 • 235次 阅读 python元组的详细介绍 python元组 元组(英文名 tuple),和列表非常的相似,它也是由一系列元素按顺序进行排列而成.... 的头像 python爬虫知识分享 发表于 02-22 15:19 • 157次 阅读 python列表的详细介绍 python列表 列表(英文名 list),是由一系列元素按顺序进行排列而成的容器。 这里面有两个重.... 的头像 python爬虫知识分享 发表于 02-22 15:14 • 157次 阅读 python cookbook(第三版)免费下载 python cookbook(第三版)免费下载。 发表于 02-22 13:57 • 47次 阅读 python运算符是什么 python运算符 0. 什么是运算符? 本章节主要说明Python的运算符。举个简单的例子 4 +.... 的头像 python爬虫知识分享 发表于 02-21 16:44 • 201次 阅读 python字符串格式化 python字符串格式化 格式化输出,主要有三种方式 使用 % 进行格式化 使用 format 函数.... 的头像 python爬虫知识分享 发表于 02-21 16:28 • 178次 阅读 python字符串格式化 python输入与输出详解 python输入与输出 无论是从我们一开始的“hello world”,还是前面章节的里各种例子,基.... 的头像 python爬虫知识分享 发表于 02-21 16:18 • 222次 阅读 python布尔值是什么 python布尔值 1. 什么是布尔值 但在Python语言中,布尔类型只有两个值 True :表示.... 的头像 python爬虫知识分享 发表于 02-21 16:10 • 190次 阅读 python整数与浮点数分解 2.3 python整数与浮点数 Python 支持的数字类型有三种:整数、浮点数和复数。 1. 整.... 的头像 python爬虫知识分享 发表于 02-18 09:09 • 291次 阅读 2.2 python字符串类型 2.2 python字符串类型 1. 如何定义字符串? 字符串是Python中最常用的数据类型之一。.... 的头像 python爬虫知识分享 发表于 02-17 17:08 • 183次 阅读 深入了解python常量与变量   Python 的变量和常量不需要事先声明类型,这是根据Python的动态语言特性而来。 的头像 python爬虫知识分享 发表于 02-16 18:22 • 340次 阅读 深入了解python常量与变量 解析两种运行Python程序方法 首先打开你的终端,直接输入 python3 回车,然后输入 print("Hello, World".... 的头像 python爬虫知识分享 发表于 02-16 18:17 • 453次 阅读 解析两种运行Python程序方法 1.2 Python 开发环境的搭建 1.2 Python 开发环境的搭建 理论上只需要你安装了 CPython 解释器后,就可以开始写 .... 的头像 python爬虫知识分享 发表于 02-15 17:16 • 316次 阅读 1.2 Python 开发环境的搭建 快速安装 Python 解释器 1.1【环境】快速安装 Python 解释器 Python 是一门解释性脚本语言,因此要想让你编写的.... 的头像 python爬虫知识分享 发表于 02-15 16:57 • 538次 阅读 快速安装 Python 解释器 《Python编程入门》.pdf 《Python编程入门》.pdf 发表于 02-11 16:03 • 122次 阅读 python获取历届春晚数据 不知道今年的春晚大家看了吗?小编表示没有看,而且是已经很多年没有完整的看过春晚了,关于看春晚的热情都.... 的头像 yiniuyun 发表于 02-07 17:52 • 314次 阅读 Python语言主要有哪些特点及Python图形界面框架推荐 Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做AB.... 的头像 Les 发表于 01-30 16:44 • 256次 阅读 PikaScript入选2021年度Gitee最有价值开源项目 PikaScript是一个完全重写的超轻量级python引擎,具有完整的解释器,字节码和虚拟机架构,.... 的头像 RTThread物联网操作系统 发表于 01-26 15:59 • 587次 阅读 入坑ESP32,首次MicroPython项目移植 原先一直在ARM架构下编写Cpython,先来说说ARM架构优缺点:1、系统资源足够,虽然pytho.... 发表于 01-18 11:24 • 68次 阅读 入坑ESP32,首次MicroPython项目移植 树莓派3B+使用STM32扩展板实现按键驱动 前几天入了个树莓派3B+,之前用过树莓派zero W觉得很方便,但是外围接口少了点。准备用3B+做个.... 发表于 01-18 11:05 • 61次 阅读 树莓派3B+使用STM32扩展板实现按键驱动


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3